package com.lcc.lynx.jdbc.enums;

/**
 * 运算符
 * @author lcc
 * @date 2025/7/14 17:10
 */
public enum Operator {
    /** 等于 = */
    EQUAL("= #{?0}"),
    /** 不等于 != */
    NOT_EQUAL("!= #{?0}"),
    /** 大于 > */
    GREATER_THAN("> #{?0}"),
    /** 大于等于 >= */
    GREATER_THAN_OR_EQUAL(">= #{?0}"),
    /** 小于 < */
    LESS_THAN("< #{?0}"),
    /** 小于等于 <= */
    LESS_THAN_OR_EQUAL("<= #{?0}"),
    /** 全模糊查询 like %?% */
    LIKE("like '%'||#{?0}||'%'"),
    /** 非全模糊查询 not like %?%  */
    NOT_LIKE("not like '%'||#{?0}||'%'"),
    /** 左模糊查询 */
    LIKE_LEFT("like '%'||#{?0}"),
    /** 非左模糊查询 */
    NOT_LIKE_LEFT("not like '%'||#{?0}"),
    /** 右模糊查询 */
    LIKE_RIGHT("like #{?0}||'%'"),
    /** 非左模糊查询 */
    NOT_LIKE_RIGHT("not like #{?0}||'%'"),
    /** 范围[?, ?] <br> 示例:sysDeptDV.wr(sysDeptDV::getSort, Operator.BETWEEN, Arrays.asList(0, 10)); * */
    BETWEEN("between #{?0} and #{?1}"),
    /** 不在范围 */
    NOT_BETWEEN("not between #{?0} and #{?1}"),
    /** 集合 */
    IN("in (?)"),
    /** 不在集合 */
    NOT_IN("not in (?)"),
    /** 为null */
    IS_NULL("is null"),
    /** 不为null */
    IS_NOT_NULL("is not null"),
    /** 存在 */
    EXISTS("exists(?0)"),
    /** 不存在 */
    NOT_EXISTS("not exists(?0)"),
    /** 递归 */
    RECURSIVE("with recursive tree as ( ?0 ) select * from tree"),

    /** 时间等于 */
    DATE_EQUAL("::date = to_date(#{?0}, 'yyyy-MM-dd')"),
    /** 时间不等于 */
    DATE_NOT_EQUAL("::date <> to_date(#{?0}, 'yyyy-MM-dd')"),
    /** 时间大于 */
    DATE_GREATER_THAN("::date > to_date(#{?0}, 'yyyy-MM-dd')"),
    /** 时间小于 */
    DATE_LESS_THAN("::date < to_date(#{?0}, 'yyyy-MM-dd')"),
    /** 时间大于等于 */
    DATE_GREATER_THAN_OR_EQUAL("::date >= to_date(#{?0}, 'yyyy-MM-dd')"),
    /** 时间小于等于 */
    DATE_LESS_THAN_OR_EQUAL("::date <= to_date(#{?0}, 'yyyy-MM-dd')"),
    /** 时间范围[?, ?] */
    DATE_BETWEEN("::date between to_date(#{?0}, 'yyyy-MM-dd') and to_date(#{?1}, 'yyyy-MM-dd')"),
    /** 非时间范围 */
    DATE_NOT_BETWEEN("::date not between to_date(#{?0}, 'yyyy-MM-dd') and to_date(#{?1}, 'yyyy-MM-dd')"),

    ;

    private String value;
    private boolean hasArg;
    private boolean isDate;
    Operator(String value) {
        this.value = value;
        this.hasArg = value.contains("?");
        this.isDate = value.contains("'yyyy-MM-dd'");
    }


    public boolean hasArg() {
        return hasArg;
    }

    public boolean isDate() {
        return isDate;
    }

    public String value() {
        return value;
    }

}
